#ifndef RGHTSIDERULES_H
#define RGHTSIDERULES_H

#include <QWidget>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QLabel>
#include <QSpinBox>
#include <QPushButton>
#include <QCheckBox>

/*! \class RightSideRules
    \brief Klasa - widget opcji wyboru zasad, według których mają poruszać się pojazdy.

   Widget RightSideRules znajduje się na prawym panelu bocznym.
   Umożliwia procentowe ustawienie zasad ruchu dla pojazdów. Są 3 możliwe zasady poruszania się samochodów.
   Dokładniejsze informacje na temat każdej z tych zasad można znaleźć w dokumentacji klasy Car.
   <ul>
    <li>\link Car::official() oficjalne \endlink
    <li>\link Car::matchingLanes() dopasowane pasy \endlink
    <li>\link Car::invertedPriority() zmiana pierwszeństwa \endlink
   </ul>
   Podobnie jak w przypadku widgetu IntenistyTraffic tak i tutaj widget dba, aby łączna suma wszystkich trzech zasad była równa 100.

*/
class RightSideRules : public QWidget
{
Q_OBJECT
public:
    explicit RightSideRules(QWidget *parent = 0);
    void configureRightSide();
    void saveRightSettingsRules();
    void readRightSettingsRules(QString name = "RoundaboutSimulator");
    QPushButton *getCmdSaveChanges();

signals:
    // wysyłany, gdy ustawienia się zmieniły i zostały zapisane
    void newRightSettings(); /*!< Sygnał jest wysyłany, gdy użytkownik kliknie przycisk _saveChangesButton(). Informuje o zmianach w opcjach dotyczących zasad ruchu.
                                  Emitowany w funkcji RightSideRules::checkProcent().
                                  Odbierany jest w klasie RSim (definicja connecta w konstruktorze RSim::RSim(QWidget *parent) ) */

public slots:
    void checkProcent();
    void colourTheButton();
    void checkNumberChecked();
    void blockSpinBox(bool);

private:
    QGroupBox *_rightSide; /*!< GroupBox o tytule "Zasady". Ma ustawiony layout _rightGridLayout */
    QVBoxLayout *_rightSideLayout; /*!< Głównyy layout widgetu. Na nim umiejscowiony jest _rightSide*/
    QGridLayout *_rightGridLayout; /*!< Na tym layoucie ustawiam odpowiednie widgety: _officialLabel, _officialSpinBox, _officialCheckBox
                                    _matchingLanesLabel, _matchingLanesSpinBox, _matchingCheckBox, _invertedPriorityLabel, _invertedPrioritySpinBox,
                                    _invertedPriorityCheckBox oraz przycisk _saveChangesButton. */

    QLabel *_officialLabel; /*!< Etykieta dla "oficjalnych" zasad */
    QLabel *_matchingLanesLabel; /*!< Etykieta dla "dopasowanych pasów" */
    QLabel *_invertedPriorityLabel; /*!< Etykieta dla zasady "zmiana pierwszeństwa" */

    QSpinBox *_officialSpinBox; /*!< Odpowiednio SpinBox dla "oficjalnych zasad". Umożliwia ustawienie(wpisanie) wartości procentowych dla danej zasady. */
    QSpinBox *_matchingLanesSpinBox; /*!< SpinBox dla "dopasowanych pasów". Umożliwia ustawienie(wpisanie) wartości procentowych dla danej zasady. */
    QSpinBox *_invertedPrioritySpinBox; /*!< SpinBox dla zasady "zmiana pierwszeństwa". Umożliwia ustawienie(wpisanie) wartości procentowych dla danej zasady. */

    QCheckBox *_officialCheckBox; /*!< CheckBox dla "oficjalnych" zasad. Umożliwia zaznaczenie na stałe wartości procentowej dla SpinBoxu odpowiadającego oficjalnym zasadom. */
    QCheckBox *_matchingCheckBox; /*!< CheckBox dla "dopasowanych pasów". Umożliwia zaznaczenie na stałe wartości procentowej dla SpinBoxu odpowiadającego "dopasowanym pasom". */
    QCheckBox *_invertedPriorityCheckBox; /*!< CheckBox dla zasady "zmiana pierwszeństwa". Umożliwia zaznaczenie na stałe wartości procentowej dla SpinBoxu odpowiadającego zasadzie "zmiana pierwszeństwa". */

    QPushButton *_saveChangesButton; /*!< Przycisk zatwierdzający zmianę usawień opcji. Jego naciśnięcie wywołuje funkcje checkProcent(). */
    QList<QSpinBox*> _spinBoxRulesList; /*!< Lista kolejncyh SpinBoxów przedstawiających rozkład procentowy zasad ruchu dla samochodów. Liczba elementów jest równa liczbie zasad zaimplementowanych w programie. */
    QList<QCheckBox*> _checkBoxRulesList; /*!< Lista checkBoxów wykorzystywanych w tym widgecie. Liczba checkboxów w liście jest równa liczbie SpinBoxów w liście _spinBoxRulesList*/

    QList <bool> uncheckAll();

};

#endif // RGHTSIDERULES_H
